package bll

import (
	"context"

	"manager/event"
	"manager/model"
	"manager/model/entity"
	"manager/store"
	"manager/store/postgres"
	"time"
)

type vehicleSkill struct {
	iVehicleSkill store.IVehicleSkill
}

var VehicleSkill = &vehicleSkill{
	iVehicleSkill: postgres.VehicleSkill,
}

func (a *vehicleSkill) init() func() {
	return func() {}
}

func (a *vehicleSkill) onEvent(*event.Data) {}

// Create 创建
func (a *vehicleSkill) Create(ctx context.Context, in *model.VehicleSkillCreateRequest) error {
	var (
		err error
	)

	// 构建创建现场数据
	c := buildVehicleSkill(in)
	_, err = a.iVehicleSkill.Create(ctx, c)
	return err
}

// Update 更新
func (a *vehicleSkill) Update(ctx context.Context, in *model.VehicleSkillUpdateRequest) error {
	var (
		dict = make(map[string]interface{})
	)

	updateAt := time.Now().Unix()
	in.UpdatedAt = &updateAt

	if in.EbikeTypeId != nil {
		dict["ebike_type_id"] = in.EbikeTypeId
	}

	if in.EbikeTypeName != nil {
		dict["ebike_type_name"] = in.EbikeTypeName
	}

	if in.Kind != nil {
		dict["kind"] = in.Kind
	}

	if in.Title != nil {
		dict["title"] = in.Title
	}

	if in.Content != nil {
		dict["content"] = in.Content
	}

	if in.Country != nil {
		dict["country"] = in.Country
	}

	if in.Language != nil {
		dict["language"] = in.Language
	}

	if in.Url != nil {
		dict["url"] = in.Url
	}

	if in.HeadImg != nil {
		dict["head_img"] = in.HeadImg
	}

	if in.NickName != nil {
		dict["nick_name"] = in.NickName
	}

	if in.KnowledgeTypeName != nil {
		dict["knowledge_type_name"] = in.KnowledgeTypeName
	}

	if in.UpdatedAt != nil {
		dict["updated_at"] = in.UpdatedAt
	}

	// do other update here
	return a.iVehicleSkill.Update(ctx, in.Id, dict)
}

// Delete 删除
func (a *vehicleSkill) Delete(ctx context.Context, in *model.VehicleSkillDeleteRequest) error {
	return a.iVehicleSkill.Delete(ctx, in.Id)
}

// List 列表查询
func (a *vehicleSkill) List(ctx context.Context, in *model.VehicleSkillListRequest) (*model.VehicleSkillListResponse, error) {
	var (
		err   error
		total int
		list  []*entity.VehicleSkill
		out   = &model.VehicleSkillListResponse{}
	)

	if total, list, err = a.iVehicleSkill.List(ctx, in); err != nil {
		return nil, err
	}

	out.Total = total
	out.List = model.VehicleSkillsEntityToDto(list)

	for i := 0; i < len(out.List); i++ {
		out.List[i].Content = "<h1>电瓶车国标车是什么标准?</h1>\n<p class=\"describe\">国家出台这个标准是因为使用电动车的人太多了，那如果没有一个统一的标准，每个厂家制造出来的电动车是不一样的，这样是不行的。有些地区也会允许不符合国标的电动车使用黄色牌照。电动车是一种非常轻便灵活的交通工具，这种交通工具还不需要消耗燃油，所以很适合在市区道路内使用。但是，随着使用电动车的人越来越多，在马路上也出现了一些非常不好的现象。有些骑电动车的朋友不遵守交通信号灯，有些人还会占用机动车道行驶，有些人还会逆行，这样是非常不利于行驶安全的。所以，有关部门为了统一管理这些电动车，就要求电动车上牌了，并且国家还要求新生产的电动车必须符合国标。</p>\n<div id=\"infoContent\"></div>\n<div class=\"articlebox\">\n<p>这个标准规定电动车的时速必须小于25公里每小时，加上电池总重量不能超过55公斤，电动机功率不能大于400w，标准电池电压小于48v，两轮间距小于1250毫米，最大宽度小于450毫米，必须安装脚踏装置，还要带有防火阻燃和防止篡改设计。</p>\n<p>国家出台这个标准是因为使用电动车的人太多了，那如果没有一个统一的标准，每个厂家制造出来的电动车是不一样的，这样是不行的。</p>\n<p>在有些地区，是要求电动车上牌的，如果自己的电动车不符合国标，那就是无法上牌的。</p>\n<img src=\"https://rtv.xitieba.net/img/3343522.jpeg?x-image-process=style/style-f579\">\n<p>有些地区也会允许不符合国标的电动车使用黄色牌照。</p>\n<p>电动车是一种非常轻便灵活的交通工具，这种交通工具还不需要消耗燃油，所以很适合在市区道路内使用。有很多朋友都喜欢骑电动车出行。</p>\n<p>但是，随着使用电动车的人越来越多，在马路上也出现了一些非常不好的现象。有些骑电动车的朋友不遵守交通信号灯，有些人还会占用机动车道行驶，有些人还会逆行，这样是非常不利于行驶安全的。</p>\n</div>"
	}

	return out, nil
}

// Find 列表查询
func (a *vehicleSkill) Find(ctx context.Context, in *model.VehicleSkillInfoRequest) (*model.VehicleSkillInfo, error) {
	var (
		err  error
		data *entity.VehicleSkill
		out  = &model.VehicleSkillInfo{}
	)

	if data, err = a.iVehicleSkill.Find(ctx, in); err != nil {
		return nil, err
	}

	out = model.VehicleSkillEntityToDto(data)
	return out, nil
}

// buildVehicleSkill 构建创建数据现场
func buildVehicleSkill(in *model.VehicleSkillCreateRequest) *entity.VehicleSkill {
	// todo: check the entity is required
	return &entity.VehicleSkill{

		EbikeTypeId: in.EbikeTypeId,

		EbikeTypeName: in.EbikeTypeName,

		Kind: in.Kind,

		Title: in.Title,

		Content: in.Content,

		Country: in.Country,

		Language: in.Language,

		Url: in.Url,

		HeadImg: in.HeadImg,

		NickName: in.NickName,

		KnowledgeTypeName: in.KnowledgeTypeName,

		CreatedAt: time.Now().Unix(),

		UpdatedAt: time.Now().Unix(),
	}
}
